using ThingsEdge.Exchange.Contracts.Variables;

namespace Digitalmes.Infrastructure.Scada;

/// <summary>
/// Tag标记名称定义。
/// </summary>
public abstract class TagDefinition
{
    #region 心跳

    /// <summary>
    /// 心跳标记。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Bit"/>、<see cref="TagDataType.Word"/> 或 <see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_Device_Heartbeat = nameof(PLC_Device_Heartbeat);

    #endregion

    #region 设备警报、状态标记

    /// <summary>
    /// 报警标记。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Bit"/> 数组。
    /// </remarks>
    public const string PLC_Equipment_Alarm = nameof(PLC_Equipment_Alarm);

    /// <summary>
    /// 设备运行状态标记，如 运行中、空闲、等待、故障、急停等。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_Equipment_State = nameof(PLC_Equipment_State);

    /// <summary>
    /// 设备运行模式标记，如 手动、自动等。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_Equipment_Mode = nameof(PLC_Equipment_Mode);

    #endregion

    #region 工位安灯

    /// <summary>
    /// 工位安灯。
    /// </summary>
    /// <remarks>
    /// 比如急停、呼叫、故障等安灯。
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_Workstation_Andon = nameof(PLC_Workstation_Andon);

    #endregion

    #region 设备能耗

    /// <summary>
    /// 设备能耗标记（按前缀匹配）。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/>、<see cref="TagDataType.DInt"/> 或 <see cref="TagDataType.Real"/> 。
    /// <para>
    /// 同工步一样，同一工位可能存在多种自动化设备，
    /// 设备点检信号点命名格式为: PLC_Equipment_Energy[_分组/分类]，匹配前缀即符合。
    /// </para>
    /// </remarks>
    public const string PLC_Equipment_Energy = nameof(PLC_Equipment_Energy);

    #endregion

    #region 进站标记

    /// <summary>
    /// 进站信号标记。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_Inbound_Sign = nameof(PLC_Inbound_Sign);

    /// <summary>
    /// 进站的 SN 标记（必须）。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 。
    /// </remarks>
    public const string PLC_Inbound_SN = nameof(PLC_Inbound_SN);

    /// <summary>
    /// 进站的产品编号标记（非必须）。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 。
    /// </remarks>
    public const string PLC_Inbound_ProductCode = nameof(PLC_Inbound_ProductCode);

    /// <summary>
    /// 进站的操作人标记。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 。
    /// </remarks>
    public const string PLC_Inbound_Operator = nameof(PLC_Inbound_Operator);

    /// <summary>
    /// 进站的班次标记（如 A=>早班；B=>夜班）。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 。
    /// </remarks>
    public const string PLC_Inbound_Shift = nameof(PLC_Inbound_Shift);

    /// <summary>
    /// 进站的 RFID 标记（非必须）。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 。
    /// </remarks>
    public const string PLC_Inbound_Rfid = nameof(PLC_Inbound_Rfid);

    #endregion

    #region 出站（存档）标记

    /// <summary>
    /// 出站信号标记。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_Outbound_Sign = nameof(PLC_Outbound_Sign);

    /// <summary>
    /// 出站的 SN 标记【必须】。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 。
    /// </remarks>
    public const string PLC_Outbound_SN = nameof(PLC_Outbound_SN);

    /// <summary>
    /// 出站的 SN 状态结果标记（1=>OK；2=>NG）【必须】。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_Outbound_PassResult = nameof(PLC_Outbound_PassResult);

    /// <summary>
    /// 出站的节拍标记【非必须】。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_Outbound_CycleTime = nameof(PLC_Outbound_CycleTime);

    #endregion

    #region 工步请求标记

    /// <summary>
    /// 工步请求信号标记（按前缀匹配）。
    /// </summary>
    /// <remarks>
    /// <para>
    /// 同一个工艺步骤中工步可能有多种（比如同一工位中既要做"设备拧紧"又要做"气密检测"），也有可能同时进行（比如拧紧点位较多，两台设备同时进行作业），这时地址配置中需要设置多个工步，
    /// 工步信号点命名格式为: PLC_StepTask_Sign[_分组/分类]，匹配前缀即符合。
    /// </para>
    /// <code>
    /// 部分工艺参数约定格式（重点是后缀）：
    /// 最小值 --> PLC_StepTask_[参数]_MixLimit，实际参数最小值;
    /// 最大值 --> PLC_StepTask_[参数]_MaxLimit，实际参数最大值;
    /// 结果值 --> PLC_StepTask_[参数]_Result，实际值判定结果，(Int 类型，1-> OK；2->NG)
    /// </code>
    /// <para>数据类型：<see cref="TagDataType.Int"/> 。</para>
    /// </remarks>
    public const string PLC_StepTask_Sign = nameof(PLC_StepTask_Sign);

    /// <summary>
    /// 工步请求 SN 标记【必须】。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 。
    /// </remarks>
    public const string PLC_StepTask_SN = nameof(PLC_StepTask_SN);

    /// <summary>
    /// 工步编号【必须】。
    /// </summary>
    /// <remarks>
    /// 工步编号对应工步唯一顺序号，通过此编号来找到系统设定的工步。
    /// <para>数据类型：<see cref="TagDataType.Int"/> 。</para>
    /// </remarks>
    public const string PLC_StepTask_Index = nameof(PLC_StepTask_Index);

    /// <summary>
    /// 出站的 SN 状态结果标记（1=>OK；2=>NG）【必须】。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_StepTask_PassResult = nameof(PLC_StepTask_PassResult);

    /// <summary>
    /// 出站的节拍标记【非必须】。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_StepTask_CycleTime = nameof(PLC_StepTask_CycleTime);

    #endregion

    #region 扫码关键物料标记

    /// <summary>
    /// 扫关键物料条码信号标记。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_ScanKey_Sign = nameof(PLC_ScanKey_Sign);

    /// <summary>
    /// 扫关键物料绑定的 SN【必须】。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 。
    /// </remarks>
    public const string PLC_ScanKey_SN = nameof(PLC_ScanKey_SN);

    /// <summary>
    /// 扫关键物料条码【必须】。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 。
    /// </remarks>
    public const string PLC_ScanKey_Barcode = nameof(PLC_ScanKey_Barcode);

    /// <summary>
    /// 扫码上料步序【非必须】。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_ScanKey_Step = nameof(PLC_ScanKey_Step);

    #endregion

    #region 扫码批次物标记

    /// <summary>
    /// 扫批次物条码信号标记。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_ScanBatch_Sign = nameof(PLC_ScanBatch_Sign);

    /// <summary>
    /// 批次号条码【必须】。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 。
    /// </remarks>
    public const string PLC_ScanBatch_Barcode = nameof(PLC_ScanBatch_Barcode);

    /// <summary>
    /// 批次数量【非必须】。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_ScanBatch_Qty = nameof(PLC_ScanBatch_Qty);

    #endregion

    #region 产品上件请求标记（无零件码的产品上件，从系统中获取 SN）

    /// <summary>
    /// 上件请求信号标记。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_Req_Sign = nameof(PLC_Req_Sign);

    /// <summary>
    /// 上件请求的产品码【必须】。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 。
    /// </remarks>
    public const string PLC_Req_ProductCode = nameof(PLC_Req_ProductCode);

    #endregion 

    #region NG口（不良品口）返工上件标记

    /// <summary>
    /// NG口（不良品口）上件请求信号。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_ReworkFeeding_Sign = nameof(PLC_ReworkFeeding_Sign);

    /// <summary>
    /// NG口（不良品口）上件请求的 SN【必须】。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 。
    /// </remarks>
    public const string PLC_ReworkFeeding_SN = nameof(PLC_ReworkFeeding_SN);

    #endregion

    #region 设备点检

    /// <summary>
    /// 设备点检请求信号标记（按前缀匹配）。
    /// </summary>
    /// <remarks>
    /// <para>
    /// 同工步一样，同一工位可能存在多种自动化设备，
    /// 设备点检信号点命名格式为: PLC_Inspect_Sign[_分组/分类]，匹配前缀即符合。
    /// 若同一工位有多个自动化设备需要点检，可以在信号标记上设置 Alias 属性来指定对应的点检设备，如 { Alias: "A" }。
    /// </para>
    /// <code>
    /// 部分工艺参数约定格式（重点是后缀）：
    /// 最小值 --> PLC_Inspect_[参数]_MixLimit，实际参数最小值;
    /// 最大值 --> PLC_Inspect_[参数]_MaxLimit，实际参数最大值;
    /// 结果值 --> PLC_Inspect_[参数]_Result，实际值判定结果，(Int 类型，1-> OK；2->NG)
    /// </code>
    /// <para>数据类型：<see cref="TagDataType.Int"/> 。</para>
    /// </remarks>
    public const string PLC_Inspect_Sign = nameof(PLC_Inspect_Sign);

    /// <summary>
    /// 设备点检请求的标件编号【必须】。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 。
    /// </remarks>
    public const string PLC_Inspect_PartNo = nameof(PLC_Inspect_PartNo);

    /// <summary>
    /// 设备点检状态结果标记（1=>OK；2=>NG）【必须】。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string PLC_Inspect_PassResult = nameof(PLC_Inspect_PassResult);

    #endregion

    #region MES 回写 PLC 的数据标记

    /// <summary>
    /// MES 反馈给 PLC 的条码标记。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 。
    /// </remarks>
    public const string MES_Callback_SN = nameof(MES_Callback_SN);

    /// <summary>
    /// MES 反馈给 PLC 的返工重上线的工序标记。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 。
    /// </remarks>
    public const string MES_Callback_Rework_Operation = nameof(MES_Callback_Rework_Operation);

    /// <summary>
    /// MES 反馈给 PLC 的返工重上线的工位标记。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 。
    /// </remarks>
    public const string MES_Callback_Rework_Workstation = nameof(MES_Callback_Rework_Workstation);

    /// <summary>
    /// MES 反馈给 PLC 的返工重上线的工步标记。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.Int"/> 。
    /// </remarks>
    public const string MES_Callback_Rework_StepTask = nameof(MES_Callback_Rework_StepTask);

    /// <summary>
    /// MES 反馈给 PLC 的异常消息标记。
    /// </summary>
    /// <remarks>
    /// 数据类型：<see cref="TagDataType.String"/> 或 <see cref="TagDataType.WString"/> 。
    /// </remarks>
    public const string MES_Callback_ErrorMessage = nameof(MES_Callback_ErrorMessage);

    #endregion
}
